package json

import (
	"encoding/json"
	"fmt"
	"log"
)

// User 定义一个用户结构体用于JSON演示
type User struct {
	ID       int    `json:"id"`
	Name     string `json:"name"`
	Email    string `json:"email,omitempty"`
	Age      int    `json:"age"`
	IsActive bool   `json:"is_active"`
}

// DemoJSONMarshalling 演示JSON序列化
func DemoJSONMarshalling() {
	fmt.Println("=== JSON处理演示 ===")
	fmt.Println("\n--- JSON序列化 ---")

	// 创建一个用户对象
	user := User{
		ID:       1,
		Name:     "张三",
		Email:    "zhangsan@example.com",
		Age:      30,
		IsActive: true,
	}

	// 序列化为JSON
	jsonData, err := json.Marshal(user)
	if err != nil {
		log.Fatalf("JSON序列化失败: %v", err)
	}

	fmt.Printf("原始对象: %+v\n", user)
	fmt.Printf("JSON字符串: %s\n", jsonData)

	// 使用MarshalIndent进行格式化输出
	jsonDataIndent, err := json.MarshalIndent(user, "", "  ")
	if err != nil {
		log.Fatalf("JSON格式化失败: %v", err)
	}

	fmt.Println("格式化的JSON:")
	fmt.Printf("%s\n", jsonDataIndent)
}

// DemoJSONUnmarshalling 演示JSON反序列化
func DemoJSONUnmarshalling() {
	fmt.Println("\n--- JSON反序列化 ---")

	// JSON字符串
	jsonStr := `{
	  "id": 2,
	  "name": "李四",
	  "email": "lisi@example.com",
	  "age": 25,
	  "is_active": false
	}`

	// 反序列化为结构体
	var user User
	err := json.Unmarshal([]byte(jsonStr), &user)
	if err != nil {
		log.Fatalf("JSON反序列化失败: %v", err)
	}

	fmt.Printf("JSON字符串: %s\n", jsonStr)
	fmt.Printf("反序列化后的对象: %+v\n", user)
}

// DemoJSONArray 演示JSON数组的序列化和反序列化
func DemoJSONArray() {
	fmt.Println("\n--- JSON数组处理 ---")

	// 创建用户切片
	users := []User{
		{ID: 1, Name: "张三", Age: 30},
		{ID: 2, Name: "李四", Age: 25},
		{ID: 3, Name: "王五", Age: 35},
	}

	// 序列化为JSON数组
	jsonData, err := json.MarshalIndent(users, "", "  ")
	if err != nil {
		log.Fatalf("JSON数组序列化失败: %v", err)
	}

	fmt.Println("用户数组的JSON:")
	fmt.Printf("%s\n", jsonData)

	// 反序列化JSON数组
	var newUsers []User
	err = json.Unmarshal(jsonData, &newUsers)
	if err != nil {
		log.Fatalf("JSON数组反序列化失败: %v", err)
	}

	fmt.Println("反序列化后的用户数组:")
	for i, u := range newUsers {
		fmt.Printf("用户 %d: %+v\n", i+1, u)
	}
}

// DemoJSONHandling 整合演示所有JSON操作
func DemoJSONHandling() {
	DemoJSONMarshalling()
	DemoJSONUnmarshalling()
	DemoJSONArray()
}
